package com.bsj.power.sdk.config.hksdk.user;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.bsj.power.sdk.config.hksdk.Common.ConfigFileUtil;
import com.bsj.power.sdk.config.hksdk.HCNetSDK;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONException;

import java.util.*;

import static com.bsj.power.sdk.config.hksdk.HCNetSDK.NET_DVR_JSON_CONFIG;
import static com.bsj.power.sdk.config.hksdk.HKSDKClientManage.hCNetSDK;

/**
 * 功能：人脸下发、查询、删除、人员计划模板配置
 */
@Slf4j
public class UserManage {

//    /**
//     * 查询人员信息
//     *
//     * @param userID
//     * @throws JSONException
//     */
//    public static String searchUserInfo(int userID) throws JSONException {
//        String result = null;
//        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
//        String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
//        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
//        ptrByteArray.write();
//
//        int lHandler = hCNetSDK.NET_DVR_StartRemoteConfig(userID, NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
//        if (lHandler < 0) {
//            System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
//            return null;
//        } else {
//
//            //输入参数，XML或者JSON数据,查询多条人员信息json报文
//            Map<String, Object> parameter = new HashMap<>();
//            parameter.put("searchID", UUID.randomUUID()); // 查询id
//            parameter.put("maxResults", 30); // 最大查询数量
//            String strInbuff = ConfigFileUtil.getReqBodyFromTemplate("conf/acs/SearchUserInfoParam.json", parameter);
//
//            log.info("查询的json报文：", strInbuff);
//
//            //把string传递到Byte数组中，后续用.getPointer()方法传入指针地址中。
//            HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
//            System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
//            ptrInbuff.write();
//
//            //定义接收结果的结构体
//            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
//
//            IntByReference pInt = new IntByReference(0);
//
//            while (true) {
//                /*
//                dwOutBuffSize是输出缓冲区大小，需要自定义指定大小，如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足，应扩大缓冲区大小
//                 */
//                int dwState = hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 20 * 1024, pInt);
//                System.out.println(dwState);
//                if (dwState == -1) {
//                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
//                    System.out.println("配置等待");
//                    try {
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {
//                        // TODO Auto-generated catch block
//                        e.printStackTrace();
//                    }
//                    continue;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
//                    System.out.println("查询人员失败");
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
//                    System.out.println("查询人员异常");
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
//                    ptrOutuff.read();
//                    log.info("查询人员成功, json：", new String(ptrOutuff.byValue).trim());
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
//                    System.out.println("获取人员完成");
//                    break;
//                }
//            }
//
//            if (!hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
//                System.out.println("NET_DVR_StopRemoteConfig接口调用失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//            } else {
//                System.out.println("NET_DVR_StopRemoteConfig接口成功");
//                lHandler = -1;
//                result = new String(ptrOutuff.byValue).trim();
//                log.info("最终查询人员结果：{}", result);
//            }
//        }
//        return result;
//    }
//
//    /**
//     * 按人员编号查询人员信息
//     *
//     * @param userID
//     * @param personNo
//     * @throws JSONException
//     */
//    public static String searchUserInfoByPersonNo(int userID, String personNo) throws JSONException {
//        String result = null;
//        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
//        String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
//        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
//        ptrByteArray.write();
//
//        int lHandler = hCNetSDK.NET_DVR_StartRemoteConfig(userID, NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
//        if (lHandler < 0) {
//            System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
//            return null;
//        } else {
//
//            //输入参数，XML或者JSON数据,查询多条人员信息json报文
//            Map<String, Object> parameter = new HashMap<>();
//            parameter.put("searchID", UUID.randomUUID()); // 查询id
//            parameter.put("maxResults", 10); // 最大查询数量
//            List<String> employeeNoList = new LinkedList<>();
//            employeeNoList.add(personNo);
//            parameter.put("EmployeeNoList", JSON.toJSONString(employeeNoList));
//            log.info("按人员编号查询人员信息请求参数:{}", JSON.toJSONString(parameter));
//            String strInbuff = ConfigFileUtil.getReqBodyFromTemplate("conf/acs/SearchUserInfoParam.json", parameter);
//
//            log.info("查询的json报文：", strInbuff);
//
//            //把string传递到Byte数组中，后续用.getPointer()方法传入指针地址中。
//            HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
//            System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
//            ptrInbuff.write();
//
//            //定义接收结果的结构体
//            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
//
//            IntByReference pInt = new IntByReference(0);
//
//            while (true) {
//                /*
//                dwOutBuffSize是输出缓冲区大小，需要自定义指定大小，如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足，应扩大缓冲区大小
//                 */
//                int dwState = hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 20 * 1024, pInt);
//                System.out.println(dwState);
//                if (dwState == -1) {
//                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
//                    System.out.println("配置等待");
//                    try {
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {
//                        // TODO Auto-generated catch block
//                        e.printStackTrace();
//                    }
//                    continue;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
//                    System.out.println("查询人员失败");
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
//                    System.out.println("查询人员异常");
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
//                    ptrOutuff.read();
//                    log.info("查询人员成功, json：", new String(ptrOutuff.byValue).trim());
//                    break;
//                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
//                    System.out.println("获取人员完成");
//                    break;
//                }
//            }
//
//            if (!hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
//                System.out.println("NET_DVR_StopRemoteConfig接口调用失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//            } else {
//                System.out.println("NET_DVR_StopRemoteConfig接口成功");
//                lHandler = -1;
//                result = new String(ptrOutuff.byValue).trim();
//                log.info("最终查询人员结果：{}", result);
//            }
//        }
//        return result;
//    }


    /**
     * 按员工编号查询
     * userID 登录id
     * personNo 人员编号
     */
    public static String getUserByEmployeeNo(int userID, String personNo) {
        String result = null;
        String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
        int longConnt = getLongConnt(strInBuffer, NET_DVR_JSON_CONFIG, userID);
        if (longConnt < 0) {
            log.warn("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为:{}", hCNetSDK.NET_DVR_GetLastError());
            return null;
        }
        //组装查询的JSON报文，这边查询的是所有的人员
        JSONObject jsonObject = new JSONObject();
        JSONObject jsonSearchCond = new JSONObject();

        //如果需要查询指定的工号人员信息，把下面注释的内容去除掉即可
        JSONArray employeeNoList = new JSONArray();
//        List<Long> userIdList = new ArrayList<>();
//        for (int i = 0; i < userIdList.size(); i++) {
        JSONObject employeeNo = new JSONObject();
        employeeNo.put("employeeNo", String.valueOf(personNo));
        employeeNoList.add(employeeNo);
//        }
        jsonSearchCond.put("EmployeeNoList", employeeNoList);
        jsonSearchCond.put("searchID", IdWorker.getIdStr());
        jsonSearchCond.put("searchResultPosition", 0);
        jsonSearchCond.put("maxResults", 1);
        jsonObject.put("UserInfoSearchCond", jsonSearchCond);
        String strInbuff = jsonObject.toString();
        log.info("查询的json报文:" + strInbuff);
        //把string传递到Byte数组中，后续用.getPointer()方法传入指针地址中。
        HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
        System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
        ptrInbuff.write();
        //定义接收结果的结构体
        HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
        IntByReference pInt = new IntByReference(0);
        /*
         *dwOutBuffSize是输出缓冲区大小，需要自定义指定大小，如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足，应扩大缓冲区大小
         */
        int dwState = hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(longConnt, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 20 * 1024, pInt);
        if (dwState == -1) {
            log.warn("NET_DVR_SendWithRecvRemoteConfig接口调用失败，错误码：{},{}", hCNetSDK.NET_DVR_GetLastError());
        } else if (dwState == hCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
            log.info("配置等待");
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                log.warn("配置等待", e);
            }
        } else if (dwState == hCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
            log.info("查询人员失败");
        } else if (dwState == hCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
            log.info("查询人员异常");
        } else if (dwState == hCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
            ptrOutuff.read();
            log.info("查询人员成功, json：", new String(ptrOutuff.byValue).trim());
        } else if (dwState == hCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
            log.info("获取人员完成");
        }
        if (!hCNetSDK.NET_DVR_StopRemoteConfig(longConnt)) {
            log.info("NET_DVR_StopRemoteConfig接口调用失败，错误码：", hCNetSDK.NET_DVR_GetLastError());
        } else {
            longConnt = -1;
            result = new String(ptrOutuff.byValue).trim();
            log.info("最终查询人员结果：{}", result);
        }
        return result;
    }

    /**
     * 建立长连接
     */
    private static int getLongConnt(String strInBuffer, int HCode, int lUserID) {
        //创建长连接
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
//        strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        return hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCode, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
    }

}
